/**
 * Object AElement()
 * 
 * @name AElement
 * @constructor
 * @author Hermann D. Schimpf <hschimpf@gschimpf.com>
 * @license http://opensource.org/licenses/gpl-2.0.php
 * @date 2010-07-30
 * @version 0.1.0
 * @return HTMLElement
 */
function AElement() {}
AElement.prototype.newObject = null;
AElement.prototype.mandatory = false;
AElement.prototype.elementType = null;
/**
 * Constructor de la clase AElement
 * 
 * @param String Tipo de elemento a crear
 * @return HTMLElement
 */
AElement.prototype._construct = function(eType) {
	/* creamos el elemento HTML */
	this.newObject = document.createElement(eType);
	/* almacenamos el tipo de elemento creado */
	this.setElementType(eType);
	/* agregamos los eventos al objeto */
	this.addEvents();
	/* recorremos los atributos y metodos locales */
	for ( var i in this)
		/* verificamos que no sea el constructor */
		if (i != '__construct' && i != '_construct' && i != 'newObject' && i != 'addEvents')
			/* agregamos el atributo/metodo al objeto */
			this.newObject[i] = this[i];
	/* iniciamos los eventos */
	this.actionPerformed('construct');
	/* retornamos el objeto */
	return this.newObject;
};
/**
 * Retorna la definicion de la clase
 * 
 * @return String Definicion de la clase
 */
AElement.prototype.toString = function() {
	/* retornamos la clase en un string */
	return "[AElement " + this.getElementType() + "]";
};
/**
 * Agrega los eventos al elemento HTML
 */
AElement.prototype.addEvents = function() {
	/* creamos un puntero al objeto actual */
	var me = this;
	/* ejecutamos el event keyup */
	this.newObject.addEventListener('change', function() {
		/* llamamos al metodo actionPerformed */
		me.actionPerformed('change');
	}, false);
	/* ejecutamos el event keyup */
	this.newObject.addEventListener('keyup', function() {
		/* llamamos al metodo actionPerformed */
		me.actionPerformed('keyup');
	}, false);
	/* ejecutamos el event keypress */
	this.newObject.addEventListener('keypress', function() {
		/* llamamos al metodo actionPerformed */
		me.actionPerformed('keypress');
	}, false);
	/* ejecutamos el event keydown */
	this.newObject.addEventListener('keydown', function() {
		/* llamamos al metodo actionPerformed */
		me.actionPerformed('keydown');
	}, false);
};
/**
 * Asigna el elemento como obligatorio
 * 
 * @param Boolean True para setear el elemento como obligatorio
 */
AElement.prototype.setMandatory = function(mandatory) {
	/* seteamos si el campo es obligatorio */
	this.mandatory = mandatory === true ? true : false;
	/* actualizamos las propiedades */
	this.actionPerformed('properties');
};
/**
 * Retorna si el elemento es obligatorio
 * 
 * @return Boolean True si el elemento es obligatorio
 */
AElement.prototype.isMandatory = function() {
	/* retornamos si el campo es obligatorio */
	return this.mandatory;
};
/**
 * Retorna el nombre del elemento
 * 
 * @return String Nombre del elemento
 */
AElement.prototype.getName = function() {
	/* retornamos el nombre del elemento */
	return this.getObject().name.length > 0 ? this.getObject().name : null;
};
/**
 * Asigna el nombre para el Elemento
 * 
 * @param String Nombre para el elemento
 */
AElement.prototype.setName = function(name) {
	/* almacenamos el nombre */
	this.getObject().name = name;
};
/**
 * Retorna el ID del elemento
 * 
 * @return String ID del elemento
 */
AElement.prototype.getID = function() {
	/* retornamos el id del elemento */
	return this.getObject().id.length > 0 ? this.getObject().id : null;
};
/**
 * Asigna el ID para el Elemento
 * 
 * @param String ID para el elemento
 */
AElement.prototype.setID = function(id) {
	/* almacenamos el id */
	this.getObject().id = id;
};
/**
 * Retorna el valor del elemento
 * 
 * @return String Valor del elemento
 */
AElement.prototype.getValue = function() {
	/* retornamos el id del elemento */
	return this.getObject().value.length > 0 ? this.getObject().value : null;
};
/**
 * Asigna el valor para el Elemento
 * 
 * @param String Valor para el elemento
 */
AElement.prototype.setValue = function(value) {
	/* almacenamos el valor */
	this.getObject().value = value;
};
/**
 * Retorna el tipo de elemento creado
 * 
 * @return String Tipo de elemento creado
 */
AElement.prototype.getElementType = function() {
	/* retornamos el tipo de elemento */
	return this.elementType;
};
/**
 * Retorna el elemento creado
 * 
 * @return HTMLElement Elemento creado
 */
AElement.prototype.getObject = function() {
	/* retornamos el objeto */
	return this.newObject != undefined ? this.newObject : this;
};
/**
 * Setea el tipo de elemento
 * 
 * @param String Tipo de elemento
 */
AElement.prototype.setElementType = function(eType) {
	/* almacenamos el tipo de elemento */
	this.elementType = eType;
};
/**
 * Setea el tipo para el elemento
 * 
 * @param String Tipo para el elemento
 */
AElement.prototype.setType = function(type) {
	/* seteamos el tipo para el campo */
	this.getObject().type = type;
};
/**
 * Ejecuta los procesos necesarios cuando se produce un evento
 * 
 * @param String Evento en proceso
 */
AElement.prototype.actionPerformed = function(event) {
	/* actualizamos el color del fondo */
	this.updateBackgroundColor();
};
/**
 * Actualiza el color del fondo del elemento
 */
AElement.prototype.updateBackgroundColor = function() {
	/* seteamos el color de fondo en blanco */
	this.getObject().style.backgroundColor = '#FFF';
	/* verificamos si el campo es obligatorio y esta vacio */
	if (this.getObject().isMandatory() && this.getObject().value.length == 0)
		/* seteamos el color del fondo en rojo */
		this.getObject().style.backgroundColor = '#F99';
};
/**
 * Setea el ancho para el elemento
 * 
 * @param Integer Ancho para el elemento
 */
AElement.prototype.setWidth = function(newWidth) {
	/* seteamos el ancho */
	this.getObject().style.width = newWidth;
};
/**
 * Setea el alto para el elemento
 * 
 * @param Integer Alto para el elemento
 */
AElement.prototype.setHeight = function(newHeight) {
	/* seteamos el alto */
	this.getObject().style.height = newHeight;
};
/**
 * Habilita o deshabilita un elemento
 * 
 * @param Boolean True para habilitar el elemento
 */
AElement.prototype.setEnabled = function(status) {
	/* seteamos si el campo esta habilitado */
	this.getObject().disabled = !status;
};
/**
 * Habilita o deshabilita la escritura sobre un elemento
 * 
 * @param Boolean True para habilitar la escritura
 */
AElement.prototype.setReadOnly = function(status) {
	/* seteamos si el campo es de solo lectura */
	this.getObject().readOnly = status;
};
/**
 * Setea el tipo de cursor al pasar el mouse sobre el elemento
 * 
 * @param String Tipo de cursor
 */
AElement.prototype.setCursor = function(cType) {
	/* seteamos el tipo de cursor para el elemento */
	this.getObject().style.cursor = cType;
};